package org.ccay.enumerable.loader;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.core.io.Resource;

import org.ccay.enumerable.EnumItem;

/**
 * 默认加载器：可获取所有加载方式的数据字典信息（包括xml，java可枚举类，数据库）
 * @author chaowangbang
 *
 */
public class DefaultEnumLoader implements EnumLoader {
	
	private static Log log = LogFactory.getLog(DefaultEnumLoader.class);
	
	private JavaEnumLoader javaEnumLoader;
	
	private JavaEnumLoader xmlEnumLoader;
	
    /**xml加载路径*/
	private Resource[] xmlClassPath;
	/**可枚举类所在包目录*/
	private String [] packageToScan;
	/**数据库加载器*/
	private EnumLoader[] enumLoaders;
	
	public void setXmlClassPath(Resource ... xmlClassPath) {
		this.xmlClassPath = xmlClassPath;
	}

	public void setPackageToScan(String ... packageToScan) {
		this.packageToScan = packageToScan;
	}

	public void setEnumLoaders(EnumLoader ... enumLoaders) {
		this.enumLoaders = enumLoaders;
	}

	@Override
	public Map<String, List<EnumItem>> load() {
		List<EnumLoader> loaders = getLoaders();
		Map<String, List<EnumItem>> result = new HashMap<String, List<EnumItem>>();
		//遍历加载loader
		for(EnumLoader loader  : loaders){
			Map<String, List<EnumItem>> temp = loader.load();
			for(Map.Entry<String, List<EnumItem>> entry : temp.entrySet()){
				if(result.containsKey(entry.getKey())){
					//判断是否已有，有的话合并EnumItem
					for(EnumItem item : entry.getValue()){
						if(null == getByValue(result.get(entry.getKey()),item.getValue())){
							result.get(entry.getKey()).add(item);
						}else{
							log.warn("已存在["+entry.getKey()+"."+item.getValue()+"],期望设置的值:'"+item.getValue()+"' 被忽略 ");
						}
					}
				}else{
					result.put(entry.getKey(), entry.getValue());
				}
			}
		}
		return result;
	}
	
	private EnumItem getByValue(List<EnumItem> items,String value){
		for(EnumItem item : items){
			if(item.getValue().equals(value)){
				return item;
			}
		}
		return null;
	}

	/**
	 * 将xml，可枚举类，可枚举数据三种加载器放置List<EnumLoader>中，供最终调用
	 * @return
	 */
	private List<EnumLoader> getLoaders() {
		List<EnumLoader> loaders = new ArrayList<EnumLoader>();
		if(javaEnumLoader != null){
			loaders.add(javaEnumLoader);
		}else{
			loaders.add(new JavaEnumLoader(packageToScan));
		}
		
		if(xmlEnumLoader != null){
			loaders.add(xmlEnumLoader);
		}else if(xmlClassPath !=null){
			loaders.add(new XmlEnumLoader(xmlClassPath));
		}
			
		if(enumLoaders!=null){
			loaders.addAll(Arrays.asList(enumLoaders));
		}
		return loaders;
	}

	public void setJavaEnumLoader(JavaEnumLoader javaEnumLoader) {
		this.javaEnumLoader = javaEnumLoader;
	}

	public void setXmlEnumLoader(JavaEnumLoader xmlEnumLoader) {
		this.xmlEnumLoader = xmlEnumLoader;
	}

}
